# RUN: yaml2obj %s -o %t
# RUN: llvm-objcopy %t %t2
# RUN: llvm-readobj --dyn-syms %t2 | FileCheck %s

## This checks that section references in the dynamic symbol table are not
## corrupted after processing a file where the sequence of section headers does
## not follow the order of their offsets. The tool avoids updating loadable
## sections, so, the content of the dynamic symbol table stays intact and the
## used section indices are preserved. In this test, the section 'dummy' comes
## first while having the offset after all other sections. If the section
## headers were sorted by their offsets by the tool, what it did before, the
## index of the '.text' section would change from '2' to '1', which resulted
## in an incorrect reference in the corresponding dynamic symbol 'foo'.

# CHECK:      Name: foo
# CHECK-NEXT: Value:
# CHECK-NEXT: Size:
# CHECK-NEXT: Binding:
# CHECK-NEXT: Type:
# CHECK-NEXT: Other:
# CHECK-NEXT: Section: .text

!ELF
FileHeader:
  Class:           ELFCLASS64
  Data:            ELFDATA2LSB
  Type:            ET_DYN
  Machine:         EM_X86_64
ProgramHeaders:
  - Type:            PT_LOAD
    Flags:           [ PF_X, PF_R ]
    FirstSec:        .text
    LastSec:         .text
    Align:           0x1000
Sections:
  - Name:            .text
    Type:            SHT_PROGBITS
    Flags:           [ SHF_ALLOC, SHF_EXECINSTR ]
    AddressAlign:    0x4
    Offset:          0x1000
    Content:         0000000000000000
  - Name:            .dynsym
    Type:            SHT_DYNSYM
    Flags:           [ SHF_ALLOC ]
    Link:            .dynstr
  - Name:            .dynstr
    Type:            SHT_STRTAB
    Flags:           [ SHF_ALLOC ]
  - Name:            dummy
    Type:            SHT_PROGBITS
    Flags:           [ SHF_ALLOC ]
    Offset:          0x1100
  - Type:            SectionHeaderTable
    Sections:
## 'dummy' comes before '.text' in the section header table despite its offset
## is larger.
      - Name:            dummy
      - Name:            .text
      - Name:            .dynsym
      - Name:            .dynstr
      - Name:            .shstrtab
      - Name:            .strtab
DynamicSymbols:
  - Name:            foo
    Type:            STT_FUNC
    Section:         .text
    Binding:         STB_GLOBAL
    Value:           0x0
    Size:            0x8
